package edu.nf.db.util;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author lzp
 * @Date 2024-05-08
 * 行处理器工具类，将一条记录转化为Array Map Bean等对象
 */
public class RowProcessor {

    /**
     * 将结果集转化为Array
     * @param rs
     * @return
     * @throws SQLException
     */
    public static Object[] toArray(ResultSet rs)throws SQLException {
        //通过rs的元数据获取查询的列数并构建Object[]
        Object[] result = new Object[rs.getMetaData().getColumnCount()];
        for (int i = 0; i < result.length; i++) {
            result[i] = rs.getObject(i+1);
        }
        return result;
    }

    /**
     * 根据列名获取某个值
     * @param rs 结果集
     * @param columnName 列名
     * @return 当前列的值
     * @throws SQLException sql的异常
     */
    public static Object toValue(ResultSet rs,String columnName)throws SQLException{
        return rs.getObject(columnName);
    }

    /**
     * 根据下标获取某个值
     * @param rs 结果集
     * @param colunIndex 下标
     * @return 当前列的值
     * @throws SQLException sql的异常
     */
    public static Object toValue(ResultSet rs,Integer colunIndex)throws SQLException{
        return rs.getObject(colunIndex);
    }

    /**
     * 将一条记录转化为Map对象
     * @param rs 结果集
     * @return Map对象
     * @throws SQLException sql的异常
     */
    public static Map<String,Object> toMap(ResultSet rs)throws SQLException{
        Map<String,Object> map = new HashMap<>();

        //获取元数据得到列名
        ResultSetMetaData metaData = rs.getMetaData();
        for (int i = 0; i < metaData.getColumnCount(); i++) {
            //通过metaDate.getColumnLabel()方法获取当前列的列名
            //通过rs.getObjet(下标)获取当前列的值
            map.put(metaData.getColumnLabel(i+1),rs.getObject(i+1));
        }
        return map;
    }

    /**
     * 将一条记录转化为实体对象
     * @param rs 结果集
     * @param beanClass
     * @return
     * @param <T>
     * @throws SQLException
     */
    public static <T> T toBean(ResultSet rs,Class<T> beanClass) throws SQLException,Exception {
        return BeanProcessor.createBean(rs,beanClass);
    }

}
